This is an R Markdown Notebook. When you execute code within the notebook, the results appear beneath the code.

Try executing this chunk by clicking the Run button within the chunk or by placing your cursor inside it and pressing Ctrl+Shift+Enter.

AC和PA的SMC进一步分析

source("tianfengRwrappers.R")
载入需要的程辑包:dplyr

载入程辑包:‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

载入需要的程辑包:reticulate
载入需要的程辑包:tidyr

载入程辑包:‘MySeuratWrappers’

The following objects are masked from ‘package:Seurat’:

    DimPlot, DoHeatmap, LabelClusters, RidgePlot, VlnPlot


载入程辑包:‘cowplot’

The following object is masked from ‘package:ggpubr’:

    get_legend

载入需要的程辑包:viridisLite

载入程辑包:‘reshape2’

The following object is masked from ‘package:tidyr’:

    smiths

NOTE: Either Arial Narrow or Roboto Condensed fonts are required to use these themes.
      Please use hrbrthemes::import_roboto_condensed() to install Roboto Condensed and
      if Arial Narrow is not on your system, please see https://bit.ly/arialnarrow
clusterProfiler v3.14.3  For help: https://guangchuangyu.github.io/software/clusterProfiler

If you use clusterProfiler in published research, please cite:
Guangchuang Yu, Li-Gen Wang, Yanyan Han, Qing-Yu He. clusterProfiler: an R package for comparing biological themes among gene clusters. OMICS: A Journal of Integrative Biology. 2012, 16(5):284-287.
Registering fonts with R

载入程辑包:‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout

载入需要的程辑包:Biobase
载入需要的程辑包:BiocGenerics
载入需要的程辑包:parallel

载入程辑包:‘BiocGenerics’

The following objects are masked from ‘package:parallel’:

    clusterApply, clusterApplyLB, clusterCall, clusterEvalQ, clusterExport, clusterMap, parApply, parCapply,
    parLapply, parLapplyLB, parRapply, parSapply, parSapplyLB

The following objects are masked from ‘package:dplyr’:

    combine, intersect, setdiff, union

The following objects are masked from ‘package:stats’:

    IQR, mad, sd, var, xtabs

The following objects are masked from ‘package:base’:

    anyDuplicated, append, as.data.frame, basename, cbind, colnames, dirname, do.call, duplicated, eval,
    evalq, Filter, Find, get, grep, grepl, intersect, is.unsorted, lapply, Map, mapply, match, mget, order,
    paste, pmax, pmax.int, pmin, pmin.int, Position, rank, rbind, Reduce, rownames, sapply, setdiff, sort,
    table, tapply, union, unique, unsplit, which, which.max, which.min

Welcome to Bioconductor

    Vignettes contain introductory material; view with 'browseVignettes()'. To cite Bioconductor, see
    'citation("Biobase")', and for packages 'citation("pkgname")'.

载入需要的程辑包:e1071

载入程辑包:‘widgetTools’

The following object is masked from ‘package:dplyr’:

    funs


载入程辑包:‘DynDoc’

The following object is masked from ‘package:BiocGenerics’:

    path


载入程辑包:‘DT’

The following object is masked from ‘package:Seurat’:

    JS

========================================
circlize version 0.4.13
CRAN page: https://cran.r-project.org/package=circlize
Github page: https://github.com/jokergoo/circlize
Documentation: https://jokergoo.github.io/circlize_book/book/

If you use it in published research, please cite:
Gu, Z. circlize implements and enhances circular visualization
  in R. Bioinformatics 2014.

This message can be suppressed by:
  suppressPackageStartupMessages(library(circlize))
========================================

载入需要的程辑包:grid
========================================
ComplexHeatmap version 2.2.0
Bioconductor page: http://bioconductor.org/packages/ComplexHeatmap/
Github page: https://github.com/jokergoo/ComplexHeatmap
Documentation: http://jokergoo.github.io/ComplexHeatmap-reference

If you use it in published research, please cite:
Gu, Z. Complex heatmaps reveal patterns and correlations in multidimensional 
  genomic data. Bioinformatics 2016.
========================================


载入程辑包:‘ComplexHeatmap’

The following object is masked from ‘package:plotly’:

    add_heatmap
library(org.Hs.eg.db)
载入需要的程辑包:AnnotationDbi
载入需要的程辑包:stats4
载入需要的程辑包:IRanges
载入需要的程辑包:S4Vectors

载入程辑包:‘S4Vectors’

The following object is masked from ‘package:plotly’:

    rename

The following object is masked from ‘package:tidyr’:

    expand

The following objects are masked from ‘package:dplyr’:

    first, rename

The following object is masked from ‘package:base’:

    expand.grid


载入程辑包:‘IRanges’

The following object is masked from ‘package:plotly’:

    slice

The following objects are masked from ‘package:dplyr’:

    collapse, desc, slice


载入程辑包:‘AnnotationDbi’

The following object is masked from ‘package:plotly’:

    select

The following object is masked from ‘package:dplyr’:

    select
library(msigdbr)
library(GSVA)
library(fgsea)
载入需要的程辑包:Rcpp
library(UCell)

分离AC和PA的SMC亚群

```r
select.cells <- CellSelector(plot = DimPlot(ds2, reduction = \umap\)) #去除边角的离群细胞
ds2 <- subset(ds2, cell = select.cells)
# saveRDS(ds2,\ds2.rds\)
umapplot(ds2,split.by = \conditions\)
ds2 <- ds2 %>% FindNeighbors(dims = 1:20) %>% FindClusters(resolution = 0.15)
umapplot(ds2, group.by = \seurat_clusters\,split.by = \conditions\)
Idents(ds2) <- ds2$conditions
ds2_AC <- subset(ds2, idents = \AC\)
ds2_PA <- subset(ds2, idents = \PA\)
ds2_AC <- ds2_AC %>% FindNeighbors(dims = 1:20) %>% FindClusters(resolution = 0.1)
ds2_PA <- ds2_PA %>% FindNeighbors(dims = 1:20) %>% FindClusters(resolution = 0.1)

umapplot(ds2_AC) + scale_y_continuous(limits = c(-5,15),breaks = NULL) +
        scale_x_continuous(limits = c(-5,15),breaks = NULL)
umapplot(ds2_PA)+ scale_y_continuous(limits = c(-5,15),breaks = NULL) +
        scale_x_continuous(limits = c(-5,15),breaks = NULL)

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->

## find markers

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuZHMyX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoZHMyLCBsb2dmYy50aHJlc2hvbGQgPSAwLjUsIG1pbi5kaWZmLnBjdCA9IDAuMiwgb25seS5wb3MgPSBGKVxuYGBgIn0= -->

```r
ds2_markers <- FindAllMarkers(ds2, logfc.threshold = 0.5, min.diff.pct = 0.2, only.pos = F)
Calculating cluster SMC1
Calculating cluster Fibromyocyte
Calculating cluster Pericyte
Calculating cluster Fibroblast
Calculating cluster SMC2
ds2_markers_pos <- ds2_markers[ds2_markers$avg_logFC>0, ]
ds2_markers_neg <- ds2_markers[ds2_markers$avg_logFC<0, ]

GO and KEGG

GSVA

exprmat <- get_data_table(ds2, highvar = T,type = "data")
clusterinfo <- ds2@meta.data[,c("orig.ident","Classification1")]
mbd <- msigdbr(species = "Homo sapiens", category = "C7") # C7 免疫
msigdbr_list <- split(x = mbd$gene_symbol, f = mbd$gs_name)

immo_res <- gsva(exprmat, msigdbr_list, kcdf="Gaussian",method = "gsva", parallel.sz = 6) #gsva 在server上运行
pheatmap(immo_res, show_rownames=1, show_colnames=0, 
         annotation_col=clusterinfo,fontsize_row=5, wiidth=8, height=6)#绘制热图
es <- data.frame(t(immo_res),stringsAsFactors=F)  #添加到单细胞矩阵中,可视化相关通路的在umap上聚集情况,可理解为一个通路即一个基因
dataset1 <- AddclusterinfoData(pbmc, es)
FeaturePlot(dataset1, features = "KEGG_PRIMARY_BILE_ACID_BIOSYNTHESIS", reduction = 'umap')

#GSEA

addmodulescore

geneset <- read.table("fibromyo")
dataset1 <- AddModuleScore(dataset1,features = geneset, name = 'fibromyo_score')
f("fibromyo_score1", dataset1, min.cutoff = 0)
dataset1 <- AddModuleScore_UCell(dataset1,features = geneset, name = 'fibromyo_score')
f("V1fibromyo_score", dataset1)

SMC2

ds2

umapplot(ds2)
ds2_markers <- FindMarkers(ds2,ident.1 = "SMC2",min.diff.pct = 0.2,logfc.threshold = 0.5)
ds2_markers_pos <- ds2_markers[ds2_markers$avg_logFC>0, ]
ds2_markers_neg <- ds2_markers[ds2_markers$avg_logFC<0, ]

ds1

umapplot(ds1)

ds1_markers <- FindMarkers(ds1,ident.1 = "SMC2",min.diff.pct = 0.2,logfc.threshold = 0.5)

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~00s          
  |++                                                | 3 % ~00s          
  |++                                                | 4 % ~00s          
  |+++                                               | 5 % ~00s          
  |++++                                              | 7 % ~00s          
  |++++                                              | 8 % ~00s          
  |+++++                                             | 9 % ~00s          
  |++++++                                            | 11% ~00s          
  |++++++                                            | 12% ~00s          
  |+++++++                                           | 13% ~00s          
  |++++++++                                          | 15% ~00s          
  |++++++++                                          | 16% ~00s          
  |+++++++++                                         | 17% ~00s          
  |++++++++++                                        | 19% ~00s          
  |++++++++++                                        | 20% ~00s          
  |+++++++++++                                       | 21% ~00s          
  |++++++++++++                                      | 23% ~00s          
  |++++++++++++                                      | 24% ~00s          
  |+++++++++++++                                     | 25% ~00s          
  |++++++++++++++                                    | 27% ~00s          
  |++++++++++++++                                    | 28% ~00s          
  |+++++++++++++++                                   | 29% ~00s          
  |++++++++++++++++                                  | 31% ~00s          
  |++++++++++++++++                                  | 32% ~00s          
  |+++++++++++++++++                                 | 33% ~00s          
  |++++++++++++++++++                                | 35% ~00s          
  |++++++++++++++++++                                | 36% ~00s          
  |+++++++++++++++++++                               | 37% ~00s          
  |++++++++++++++++++++                              | 39% ~00s          
  |++++++++++++++++++++                              | 40% ~00s          
  |+++++++++++++++++++++                             | 41% ~00s          
  |++++++++++++++++++++++                            | 43% ~00s          
  |++++++++++++++++++++++                            | 44% ~00s          
  |+++++++++++++++++++++++                           | 45% ~00s          
  |++++++++++++++++++++++++                          | 47% ~00s          
  |++++++++++++++++++++++++                          | 48% ~00s          
  |+++++++++++++++++++++++++                         | 49% ~00s          
  |++++++++++++++++++++++++++                        | 51% ~00s          
  |++++++++++++++++++++++++++                        | 52% ~00s          
  |+++++++++++++++++++++++++++                       | 53% ~00s          
  |++++++++++++++++++++++++++++                      | 55% ~00s          
  |++++++++++++++++++++++++++++                      | 56% ~00s          
  |+++++++++++++++++++++++++++++                     | 57% ~00s          
  |++++++++++++++++++++++++++++++                    | 59% ~00s          
  |++++++++++++++++++++++++++++++                    | 60% ~00s          
  |+++++++++++++++++++++++++++++++                   | 61% ~00s          
  |++++++++++++++++++++++++++++++++                  | 63% ~00s          
  |++++++++++++++++++++++++++++++++                  | 64% ~00s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~00s          
  |++++++++++++++++++++++++++++++++++                | 67% ~00s          
  |++++++++++++++++++++++++++++++++++                | 68% ~00s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~00s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~00s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~00s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~00s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~00s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~00s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=00s  
ds1_markers_pos <- ds1_markers[ds1_markers$avg_logFC>0, ]
ds1_markers_neg <- ds1_markers[ds1_markers$avg_logFC<0, ]
gene_list <- rownames(ds1_markers_pos)
up_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "ALL", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)

dotplot(up_enrich.go, showCategory = 10)

cnetplot(up_enrich.go, showCategory = 10)

emapplot(up_enrich.go, showCategory = 10)


##down-regulated genes
gene_list <- rownames(ds1_markers_neg)
down_enrich.go <- enrichGO(
    gene = gene_list, # 基因列表文件中的基因名称
    OrgDb = org.Hs.eg.db, keyType = "SYMBOL",
    ont = "ALL", # 可选 BP、MF、CC,也可以指定 ALL 同时计算 3 者
    pAdjustMethod = "fdr", pvalueCutoff = 0.05, qvalueCutoff = 0.2)

dotplot(down_enrich.go, showCategory = 10)

cnetplot(down_enrich.go, showCategory = 10)

emapplot(down_enrich.go, showCategory = 10)

BMP通路相关

雷达图

Add a new chunk by clicking the Insert Chunk button on the toolbar or by pressing Ctrl+Alt+I.

When you save the notebook, an HTML file containing the code and output will be saved alongside it (click the Preview button or press Ctrl+Shift+K to preview the HTML file).

The preview shows you a rendered HTML copy of the contents of the editor. Consequently, unlike Knit, Preview does not run any R code chunks. Instead, the output of the chunk when it was last run in the editor is displayed.

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKVGhpcyBpcyBhbiBbUiBNYXJrZG93bl0oaHR0cDovL3JtYXJrZG93bi5yc3R1ZGlvLmNvbSkgTm90ZWJvb2suIFdoZW4geW91IGV4ZWN1dGUgY29kZSB3aXRoaW4gdGhlIG5vdGVib29rLCB0aGUgcmVzdWx0cyBhcHBlYXIgYmVuZWF0aCB0aGUgY29kZS4gCgpUcnkgZXhlY3V0aW5nIHRoaXMgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpSdW4qIGJ1dHRvbiB3aXRoaW4gdGhlIGNodW5rIG9yIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW5zaWRlIGl0IGFuZCBwcmVzc2luZyAqQ3RybCtTaGlmdCtFbnRlciouIAoKIyBBQ+WSjFBB55qEU01D6L+b5LiA5q2l5YiG5p6QCmBgYHtyfQpzb3VyY2UoInRpYW5mZW5nUndyYXBwZXJzLlIiKQpsaWJyYXJ5KG9yZy5Icy5lZy5kYikKbGlicmFyeShtc2lnZGJyKQpsaWJyYXJ5KEdTVkEpCmxpYnJhcnkoZmdzZWEpCmxpYnJhcnkoVUNlbGwpCmRzMiA8LSByZWFkUkRTKCJkczIucmRzIikKZHMwIDwtIHJlYWRSRFMoImRzMC5yZHMiKQpkczEgPC0gcmVhZFJEUygiZHMxLnJkcyIpCmBgYAoKIyMg5YiG56a7QUPlkoxQQeeahFNNQ+S6mue+pApgYGB7cn0Kc2VsZWN0LmNlbGxzIDwtIENlbGxTZWxlY3RvcihwbG90ID0gRGltUGxvdChkczIsIHJlZHVjdGlvbiA9ICJ1bWFwIikpICPljrvpmaTovrnop5LnmoTnprvnvqTnu4bog54KZHMyIDwtIHN1YnNldChkczIsIGNlbGwgPSBzZWxlY3QuY2VsbHMpCiMgc2F2ZVJEUyhkczIsImRzMi5yZHMiKQp1bWFwcGxvdChkczIsc3BsaXQuYnkgPSAiY29uZGl0aW9ucyIpCmRzMiA8LSBkczIgJT4lIEZpbmROZWlnaGJvcnMoZGltcyA9IDE6MjApICU+JSBGaW5kQ2x1c3RlcnMocmVzb2x1dGlvbiA9IDAuMTUpCnVtYXBwbG90KGRzMiwgZ3JvdXAuYnkgPSAic2V1cmF0X2NsdXN0ZXJzIixzcGxpdC5ieSA9ICJjb25kaXRpb25zIikKSWRlbnRzKGRzMikgPC0gZHMyJGNvbmRpdGlvbnMKZHMyX0FDIDwtIHN1YnNldChkczIsIGlkZW50cyA9ICJBQyIpCmRzMl9QQSA8LSBzdWJzZXQoZHMyLCBpZGVudHMgPSAiUEEiKQpkczJfQUMgPC0gZHMyX0FDICU+JSBGaW5kTmVpZ2hib3JzKGRpbXMgPSAxOjIwKSAlPiUgRmluZENsdXN0ZXJzKHJlc29sdXRpb24gPSAwLjEpCmRzMl9QQSA8LSBkczJfUEEgJT4lIEZpbmROZWlnaGJvcnMoZGltcyA9IDE6MjApICU+JSBGaW5kQ2x1c3RlcnMocmVzb2x1dGlvbiA9IDAuMSkKCnVtYXBwbG90KGRzMl9BQykgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSwxNSksYnJlYWtzID0gTlVMTCkgKwogICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC01LDE1KSxicmVha3MgPSBOVUxMKQp1bWFwcGxvdChkczJfUEEpKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtNSwxNSksYnJlYWtzID0gTlVMTCkgKwogICAgICAgIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC01LDE1KSxicmVha3MgPSBOVUxMKQpgYGAKIyMgZmluZCBtYXJrZXJzCmBgYHtyfQpkczJfbWFya2VycyA8LSBGaW5kQWxsTWFya2VycyhkczIsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuNSwgbWluLmRpZmYucGN0ID0gMC4yLCBvbmx5LnBvcyA9IEYpCmRzMl9tYXJrZXJzX3BvcyA8LSBkczJfbWFya2Vyc1tkczJfbWFya2VycyRhdmdfbG9nRkM+MCwgXQpkczJfbWFya2Vyc19uZWcgPC0gZHMyX21hcmtlcnNbZHMyX21hcmtlcnMkYXZnX2xvZ0ZDPDAsIF0KYGBgCgojIyBHTyBhbmQgS0VHRwpgYGB7cixmaWcud2lkdGg9OCxmaWcuaGVpZ2h0PTZ9CiMjdXAtcmVndWxhdGVkIGdlbmVzCmdlbmVfbGlzdCA8LSBkczJfbWFya2Vyc19wb3NbZHMyX21hcmtlcnNfcG9zJGNsdXN0ZXIgPT0gIlNNQzIiLF0kZ2VuZQoKdXBfZW5yaWNoLmdvIDwtIGVucmljaEdPKAogICAgZ2VuZSA9IGdlbmVfbGlzdCwgIyDln7rlm6DliJfooajmlofku7bkuK3nmoTln7rlm6DlkI3np7AKICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLCBrZXlUeXBlID0gIlNZTUJPTCIsCiAgICBvbnQgPSAiQUxMIiwgIyDlj6/pgIkgQlDjgIFNRuOAgUND77yM5Lmf5Y+v5Lul5oyH5a6aIEFMTCDlkIzml7borqHnrpcgMyDogIUKICAgIHBBZGp1c3RNZXRob2QgPSAiZmRyIiwgcHZhbHVlQ3V0b2ZmID0gMC4wNSwgcXZhbHVlQ3V0b2ZmID0gMC4yKQoKZG90cGxvdCh1cF9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKSArIHRoZW1lX2NsYXNzaWMoKQplbnJpY2hwbG90OjpjbmV0cGxvdCh1cF9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDUsIGNvbG9yRWRnZSA9IFQpCmVtYXBwbG90KHVwX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApCgojI2Rvd24tcmVndWxhdGVkIGdlbmVzCmdlbmVfbGlzdCA8LSBkczJfbWFya2Vyc19uZWdbZHMyX21hcmtlcnNfbmVnJGNsdXN0ZXIgPT0gMixdJGdlbmUKZG93bl9lbnJpY2guZ28gPC0gZW5yaWNoR08oCiAgICBnZW5lID0gZ2VuZV9saXN0LCAjIOWfuuWboOWIl+ihqOaWh+S7tuS4reeahOWfuuWboOWQjeensAogICAgT3JnRGIgPSBvcmcuSHMuZWcuZGIsIGtleVR5cGUgPSAiU1lNQk9MIiwKICAgIG9udCA9ICJBTEwiLCAjIOWPr+mAiSBCUOOAgU1G44CBQ0PvvIzkuZ/lj6/ku6XmjIflrpogQUxMIOWQjOaXtuiuoeeulyAzIOiAhQogICAgcEFkanVzdE1ldGhvZCA9ICJmZHIiLCBwdmFsdWVDdXRvZmYgPSAwLjA1LCBxdmFsdWVDdXRvZmYgPSAwLjIpCgpkb3RwbG90KGRvd25fZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSAxMCkKY25ldHBsb3QoZG93bl9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKQplbWFwcGxvdChkb3duX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApCgpgYGAKCgojIyBHU1ZBCmBgYHtyfQpleHBybWF0IDwtIGdldF9kYXRhX3RhYmxlKGRzMiwgaGlnaHZhciA9IFQsdHlwZSA9ICJkYXRhIikKY2x1c3RlcmluZm8gPC0gZHMyQG1ldGEuZGF0YVssYygib3JpZy5pZGVudCIsIkNsYXNzaWZpY2F0aW9uMSIpXQptYmQgPC0gbXNpZ2RicihzcGVjaWVzID0gIkhvbW8gc2FwaWVucyIsIGNhdGVnb3J5ID0gIkM3IikgIyBDNyDlhY3nlqsKbXNpZ2Ricl9saXN0IDwtIHNwbGl0KHggPSBtYmQkZ2VuZV9zeW1ib2wsIGYgPSBtYmQkZ3NfbmFtZSkKCmltbW9fcmVzIDwtIGdzdmEoZXhwcm1hdCwgbXNpZ2Ricl9saXN0LCBrY2RmPSJHYXVzc2lhbiIsbWV0aG9kID0gImdzdmEiLCBwYXJhbGxlbC5zeiA9IDYpICNnc3ZhIOWcqHNlcnZlcuS4iui/kOihjApwaGVhdG1hcChpbW1vX3Jlcywgc2hvd19yb3duYW1lcz0xLCBzaG93X2NvbG5hbWVzPTAsIAogICAgICAgICBhbm5vdGF0aW9uX2NvbD1jbHVzdGVyaW5mbyxmb250c2l6ZV9yb3c9NSwgd2lpZHRoPTgsIGhlaWdodD02KSPnu5jliLbng63lm74KYGBgCgoKYGBge3J9CmVzIDwtIGRhdGEuZnJhbWUodChpbW1vX3Jlcyksc3RyaW5nc0FzRmFjdG9ycz1GKSAgI+a3u+WKoOWIsOWNlee7huiDnuefqemYteS4re+8jOWPr+inhuWMluebuOWFs+mAmui3r+eahOWcqHVtYXDkuIrogZrpm4bmg4XlhrXvvIzlj6/nkIbop6PkuLrkuIDkuKrpgJrot6/ljbPkuIDkuKrln7rlm6AKZGF0YXNldDEgPC0gQWRkY2x1c3RlcmluZm9EYXRhKHBibWMsIGVzKQpGZWF0dXJlUGxvdChkYXRhc2V0MSwgZmVhdHVyZXMgPSAiS0VHR19QUklNQVJZX0JJTEVfQUNJRF9CSU9TWU5USEVTSVMiLCByZWR1Y3Rpb24gPSAndW1hcCcpCgoKYGBgCgojR1NFQQpgYGB7cn0KbGlicmFyeShjbHVzdGVyUHJvZmlsZXIpCmxpYnJhcnkoZW5yaWNocGxvdCkKbWFya2VycyA8LSBGaW5kTWFya2VycyhkczIsIGlkZW50LjEgPSAiU01DMiIsbWluLnBjdCA9IDAuMSwgbG9nZmMudGhyZXNob2xkID0gMC4xLHRocmVzaC51c2UgPSAwLjkpCkRFR3MgPC0gbWFya2VycyRhdmdfbG9nRkMKbmFtZXMoREVHcykgPSByb3duYW1lcyhtYXJrZXJzKQpERUdzIDwtIHNvcnQoREVHcyxkZWNyZWFzaW5nID0gVCkKaGVhZChERUdzKQoKIyBHT19kYiA8LSBtc2lnZGJyKHNwZWNpZXMgPSAiSG9tbyBzYXBpZW5zIixjYXRlZ29yeSA9ICJDNSIpICU+JQogICMgZHBseXI6OnNlbGVjdChnc19leGFjdF9zb3VyY2UsZ2VuZV9zeW1ib2wpICNDNSBHTyAgQzcg5YWN55arCgptZGJfYzIgPC0gbXNpZ2RicihzcGVjaWVzID0gIkhvbW8gc2FwaWVucyIsIGNhdGVnb3J5ID0gIkMyIikKbWRiX2tlZ2cgPC0gIG1kYl9jMiBbZ3JlcCgiXktFR0ciLCBtZGJfYzIgJGdzX25hbWUpLF0KR09fZGI8LW1kYl9rZWdnICU+JSBkcGx5cjo6c2VsZWN0KGdzX25hbWUsIGdlbmVfc3ltYm9sKQoKR1NFQV9yZXMgPC0gY2x1c3RlclByb2ZpbGVyOjpHU0VBKERFR3MsIFRFUk0yR0VORSA9IEdPX2RiLHB2YWx1ZUN1dG9mZiA9IDAuMSkKCmRvdHBsb3QoR1NFQV9yZXMsc3BsaXQ9Ii5zaWduIikrZmFjZXRfZ3JpZCh+LnNpZ24pICsgdGhlbWVfY2xhc3NpYygpCgplbnJpY2hwbG90Ojpnc2VhcGxvdDIoR1NFQV9yZXMsIGdlbmVTZXRJRCA9IDEsIHRpdGxlID0gR1NFQV9yZXMkRGVzY3JpcHRpb25bMV0pCgojIGZvcihpIGluIHNlcV9hbG9uZyhHU0VBX3Jlc0ByZXN1bHQkSUQpKXsKIyAgIGVucmljaHBsb3Q6OmdzZWFwbG90MihHU0VBX3JlcywgZ2VuZVNldElEID0gaSwgdGl0bGUgPSBHU0VBX3Jlc0ByZXN1bHQkSURbaV0pCiMgfQpyaWRnZXBsb3QoR1NFQV9yZXMpIApnc2VhcGxvdDIoR1NFQV9yZXMsMTo1KQpgYGAKCgojICBhZGRtb2R1bGVzY29yZQpgYGB7cn0KZ2VuZXNldCA8LSByZWFkLnRhYmxlKCJmaWJyb215byIpCmRhdGFzZXQxIDwtIEFkZE1vZHVsZVNjb3JlKGRhdGFzZXQxLGZlYXR1cmVzID0gZ2VuZXNldCwgbmFtZSA9ICdmaWJyb215b19zY29yZScpCmYoImZpYnJvbXlvX3Njb3JlMSIsIGRhdGFzZXQxLCBtaW4uY3V0b2ZmID0gMCkKZGF0YXNldDEgPC0gQWRkTW9kdWxlU2NvcmVfVUNlbGwoZGF0YXNldDEsZmVhdHVyZXMgPSBnZW5lc2V0LCBuYW1lID0gJ2ZpYnJvbXlvX3Njb3JlJykKZigiVjFmaWJyb215b19zY29yZSIsIGRhdGFzZXQxKQpgYGAKCiMgU01DMgpkczIKYGBge3IgZmlnLndpZHRoPTgsZmlnLmhlaWdodD00fQp1bWFwcGxvdChkczIpCmRzMl9tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKGRzMixpZGVudC4xID0gIlNNQzIiLG1pbi5kaWZmLnBjdCA9IDAuMixsb2dmYy50aHJlc2hvbGQgPSAwLjUpCmRzMl9tYXJrZXJzX3BvcyA8LSBkczJfbWFya2Vyc1tkczJfbWFya2VycyRhdmdfbG9nRkM+MCwgXQpkczJfbWFya2Vyc19uZWcgPC0gZHMyX21hcmtlcnNbZHMyX21hcmtlcnMkYXZnX2xvZ0ZDPDAsIF0KYGBgCmBgYHtyfQpnZW5lX2xpc3QgPC0gcm93bmFtZXMoZHMyX21hcmtlcnNfcG9zKQp1cF9lbnJpY2guZ28gPC0gZW5yaWNoR08oCiAgICBnZW5lID0gZ2VuZV9saXN0LCAjIOWfuuWboOWIl+ihqOaWh+S7tuS4reeahOWfuuWboOWQjeensAogICAgT3JnRGIgPSBvcmcuSHMuZWcuZGIsIGtleVR5cGUgPSAiU1lNQk9MIiwKICAgIG9udCA9ICJBTEwiLCAjIOWPr+mAiSBCUOOAgU1G44CBQ0PvvIzkuZ/lj6/ku6XmjIflrpogQUxMIOWQjOaXtuiuoeeulyAzIOiAhQogICAgcEFkanVzdE1ldGhvZCA9ICJmZHIiLCBwdmFsdWVDdXRvZmYgPSAwLjA1LCBxdmFsdWVDdXRvZmYgPSAwLjIpCgpkb3RwbG90KHVwX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApCmNuZXRwbG90KHVwX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gOCwgY29sb3JFZGdlID0gVCkKZW1hcHBsb3QodXBfZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSAxMCkKCiMjZG93bi1yZWd1bGF0ZWQgZ2VuZXMKZ2VuZV9saXN0IDwtIHJvd25hbWVzKGRzMl9tYXJrZXJzX25lZykKZG93bl9lbnJpY2guZ28gPC0gZW5yaWNoR08oCiAgICBnZW5lID0gZ2VuZV9saXN0LCAjIOWfuuWboOWIl+ihqOaWh+S7tuS4reeahOWfuuWboOWQjeensAogICAgT3JnRGIgPSBvcmcuSHMuZWcuZGIsIGtleVR5cGUgPSAiU1lNQk9MIiwKICAgIG9udCA9ICJBTEwiLCAjIOWPr+mAiSBCUOOAgU1G44CBQ0PvvIzkuZ/lj6/ku6XmjIflrpogQUxMIOWQjOaXtuiuoeeulyAzIOiAhQogICAgcEFkanVzdE1ldGhvZCA9ICJmZHIiLCBwdmFsdWVDdXRvZmYgPSAwLjA1LCBxdmFsdWVDdXRvZmYgPSAwLjIpCmdnc2F2ZSgiZG93bl9lbnJpY2gxLnN2ZyIsZGV2aWNlID0gc3ZnLCBwbG90ID0gZG90cGxvdChkb3duX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA2KQoKZ2dzYXZlKCJkb3duX2VucmljaC5zdmciLGRldmljZSA9IHN2ZywgcGxvdCA9IGNuZXRwbG90KGRvd25fZW5yaWNoLmdvLCAgc2hvd0NhdGVnb3J5ID0gOCwgY29sb3JFZGdlID0gVCksIHdpZHRoID0gMTAsIGhlaWdodCA9IDYpCmVtYXBwbG90KGRvd25fZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSAxMCkKCmBgYAoKCmRzMQpgYGB7cn0KdW1hcHBsb3QoZHMxKQpkczFfbWFya2VycyA8LSBGaW5kTWFya2VycyhkczEsaWRlbnQuMSA9ICJTTUMyIixtaW4uZGlmZi5wY3QgPSAwLjIsbG9nZmMudGhyZXNob2xkID0gMC41KQpkczFfbWFya2Vyc19wb3MgPC0gZHMxX21hcmtlcnNbZHMxX21hcmtlcnMkYXZnX2xvZ0ZDPjAsIF0KZHMxX21hcmtlcnNfbmVnIDwtIGRzMV9tYXJrZXJzW2RzMV9tYXJrZXJzJGF2Z19sb2dGQzwwLCBdCmBgYApgYGB7cn0KZ2VuZV9saXN0IDwtIHJvd25hbWVzKGRzMV9tYXJrZXJzX3BvcykKdXBfZW5yaWNoLmdvIDwtIGVucmljaEdPKAogICAgZ2VuZSA9IGdlbmVfbGlzdCwgIyDln7rlm6DliJfooajmlofku7bkuK3nmoTln7rlm6DlkI3np7AKICAgIE9yZ0RiID0gb3JnLkhzLmVnLmRiLCBrZXlUeXBlID0gIlNZTUJPTCIsCiAgICBvbnQgPSAiQUxMIiwgIyDlj6/pgIkgQlDjgIFNRuOAgUND77yM5Lmf5Y+v5Lul5oyH5a6aIEFMTCDlkIzml7borqHnrpcgMyDogIUKICAgIHBBZGp1c3RNZXRob2QgPSAiZmRyIiwgcHZhbHVlQ3V0b2ZmID0gMC4wNSwgcXZhbHVlQ3V0b2ZmID0gMC4yKQoKZG90cGxvdCh1cF9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKQpjbmV0cGxvdCh1cF9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKQplbWFwcGxvdCh1cF9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKQoKIyNkb3duLXJlZ3VsYXRlZCBnZW5lcwpnZW5lX2xpc3QgPC0gcm93bmFtZXMoZHMxX21hcmtlcnNfbmVnKQpkb3duX2VucmljaC5nbyA8LSBlbnJpY2hHTygKICAgIGdlbmUgPSBnZW5lX2xpc3QsICMg5Z+65Zug5YiX6KGo5paH5Lu25Lit55qE5Z+65Zug5ZCN56ewCiAgICBPcmdEYiA9IG9yZy5Icy5lZy5kYiwga2V5VHlwZSA9ICJTWU1CT0wiLAogICAgb250ID0gIkFMTCIsICMg5Y+v6YCJIEJQ44CBTUbjgIFDQ++8jOS5n+WPr+S7peaMh+WumiBBTEwg5ZCM5pe26K6h566XIDMg6ICFCiAgICBwQWRqdXN0TWV0aG9kID0gImZkciIsIHB2YWx1ZUN1dG9mZiA9IDAuMDUsIHF2YWx1ZUN1dG9mZiA9IDAuMikKCmRvdHBsb3QoZG93bl9lbnJpY2guZ28sIHNob3dDYXRlZ29yeSA9IDEwKQpjbmV0cGxvdChkb3duX2VucmljaC5nbywgc2hvd0NhdGVnb3J5ID0gMTApCmVtYXBwbG90KGRvd25fZW5yaWNoLmdvLCBzaG93Q2F0ZWdvcnkgPSAxMCkKCmBgYAojIEJNUOmAmui3r+ebuOWFswpgYGB7cn0KRG90cGxvdChjKCJCTVAiLCJCTVBSMUEiLCJCTVBSMUIiKSxkczIpCkRvdHBsb3QoYygiQk1QUjFBIiwiQk1QUjFCIiksZHMxKQpmKCJETFg1IixkczIpCmBgYAojIOmbt+i+vuWbvgpgYGB7cn0KbGlicmFyeShmbXNiKQoKZGF0YT1hcy5kYXRhLmZyYW1lKG1hdHJpeChzYW1wbGUoMDo1MCwgMTgscmVwbGFjZT1UKSAsIG5jb2w9NikpCmNvbG5hbWVzKGRhdGEpPWMoJ0lMLTEgc2lnbmFsaW5nIHBhdGh3YXknLCdSZXNwb25zZSB0byBJRk5hJywnTkZrQiBzaWduYWxpbmcgcGF0aHdheScsJ0lMLTYgc2lnbmFsaW5nIHBhdGh3YXknLCAnTXVzY2xlIGNvbnRyYWN0aW9uJywnUmVzcG9uc2UgdG8gSUZOcicpCnJvd25hbWVzKGRhdGEpIDwtIGMoJ01vbm9jeXRlJywnTmV1dHJvcGhpbCcsJ01hY3JvcGhhZ2UnKQojIOeUqOS6jueUn+aIkOmbt+i+vuWbvueahOacgOWkp+acgOWwj+WAvApkYXRhPXJiaW5kKHJlcCg1MCw1KSAsIHJlcCgwLDUpICwgZGF0YSkKCmNvbG9yc19saXN0WzE6M10KY29sb3JzX2JvcmRlciA8LSBjb2xvcnNfbGlzdFsxOjNdCmNvbG9yc19pbiA8LSBhZXJvX2NvbG9yc19saXN0WzE6M10KcmFkYXJjaGFydCggZGF0YSAsIGF4aXN0eXBlPTAsCiBwY29sPWNvbG9yc19ib3JkZXIgLCBwZmNvbD1jb2xvcnNfaW4gLCBwbHdkPTEuMyAsIHBsdHk9MSxwdHk9MzIsCiBjZ2xjb2w9ImJsYWNrIiwgY2dsdHk9MywgY2dsd2Q9MC42LAopCmxlZ2VuZCh4PTEuNSwgeT0xLCBsZWdlbmQgPSByb3duYW1lcyhkYXRhWy1jKDEsMiksXSksIGJ0eSA9ICJuIiwgcGNoPTIwICwgY29sPWNvbG9yc19ib3JkZXIsIHRleHQuY29sID0gImJsYWNrIiwgY2V4PTEsIHB0LmNleD0yKQpgYGAKCgpBZGQgYSBuZXcgY2h1bmsgYnkgY2xpY2tpbmcgdGhlICpJbnNlcnQgQ2h1bmsqIGJ1dHRvbiBvbiB0aGUgdG9vbGJhciBvciBieSBwcmVzc2luZyAqQ3RybCtBbHQrSSouCgpXaGVuIHlvdSBzYXZlIHRoZSBub3RlYm9vaywgYW4gSFRNTCBmaWxlIGNvbnRhaW5pbmcgdGhlIGNvZGUgYW5kIG91dHB1dCB3aWxsIGJlIHNhdmVkIGFsb25nc2lkZSBpdCAoY2xpY2sgdGhlICpQcmV2aWV3KiBidXR0b24gb3IgcHJlc3MgKkN0cmwrU2hpZnQrSyogdG8gcHJldmlldyB0aGUgSFRNTCBmaWxlKS4KClRoZSBwcmV2aWV3IHNob3dzIHlvdSBhIHJlbmRlcmVkIEhUTUwgY29weSBvZiB0aGUgY29udGVudHMgb2YgdGhlIGVkaXRvci4gQ29uc2VxdWVudGx5LCB1bmxpa2UgKktuaXQqLCAqUHJldmlldyogZG9lcyBub3QgcnVuIGFueSBSIGNvZGUgY2h1bmtzLiBJbnN0ZWFkLCB0aGUgb3V0cHV0IG9mIHRoZSBjaHVuayB3aGVuIGl0IHdhcyBsYXN0IHJ1biBpbiB0aGUgZWRpdG9yIGlzIGRpc3BsYXllZC4K